*/
/**********************************************************************
  * @file:        xxx.c
  * @author:      guangjieMVP
  * @version:     v1.00.00
  * @date:        2020-xx-xx
  * @github:      https://github.com/guangjieMVP
  * @brief: 
************************************************************************/
#include "stack_with_check.h"
#include "string.h"

/**********************************************************************
  * @brief:         初始化对象(构造函数)
  * @param[in]:     None
  * @retval[out]:   None
  * @author:        guangjieMVP
  * @github:        https://github.com/guangjieMVP
************************************************************************/
int stack_check_init(stack_check_t *s, int *s_buffer, int size, int (*check)(struct _stack_check *s,int vol))
{
    if(!s || !s_buffer || size <= 0 || !check)     //参数检查
        return -1;

    stack_init(&s->super, s_buffer, size);         //先初始化父类成员
    s->check = check;                              //再初始化派生类成员
    return 0;
}

/**********************************************************************
  * @brief:         解初始化对象(析构函数)
  * @param[in]:     None
  * @retval[out]:   None
  * @author:        guangjieMVP
  * @github:        https://github.com/guangjieMVP
************************************************************************/
int stack_check_deinit(stack_check_t *s)
{
    if(!s)
        return -1;

    s->check = NULL;                    //先解初始化派生类成员
    return stack_deinit(&s->super);     //再解初始化父类成员
}

/**********************************************************************
  * @brief:         入栈
  * @param[in]:     None
  * @retval[out]:   None
  * @author:        guangjieMVP
  * @github:        https://github.com/guangjieMVP
************************************************************************/
int stack_check_push(stack_check_t *s, int val)
{
    if(!s)
        return -1;

    if( s->check == NULL || s->check(s, val) )       //当没有检查方式时为普通栈或者入栈的值通过检查方式
    {
        return stack_push(&s->super, val);           //复用父类的入栈函数
    }
        
    return -1;
}

/**********************************************************************
  * @brief:         出栈
  * @param[in]:     None
  * @retval[out]:   None
  * @author:        guangjieMVP
  * @github:        https://github.com/guangjieMVP
************************************************************************/
int stack_check_pop(stack_check_t *s, int *val)
{
    if(!s || !val)
        return -1;
     
    return stack_pop(&s->super, val);      //复用父类的出栈函数
}